ποΈGitΠ―ΡΠ°ποΈ
Node / meshtastic / Meshtastic-Android / files / specs / 20260520-153449-node-list-context-menu / tasks.md
specs/20260520-153449-node-list-context-menu/tasks.md 4e48e64e786b58d7c73280f7aa6ebf55be9e53e5 (4e48e64e) Text, 10.85 KB
Tasks: Node List Context Menu Alignment
Input: Design documents from T383838/specs/20260520-153449-node-list-context-menu/
Prerequisites: plan.md β
, spec.md β
, research.md β
, data-model.md β
, contracts/ β
Tests: No automated tests requested by the feature specification. Constitution-required verification tasks are included in the Polish phase.
Verification: Constitution-required validation tasks (spotlessCheck, detekt, allTests) are included in the final phase.
Organization: Tasks are grouped by user story to enable independent implementation and testing of each story.
Format: T383838[ID] [P?] [Story] Description
β’ [P]: Can run in parallel (different files, no dependencies)
β’ [Story]: Which user story this task belongs to (e.g., US1, US2, US3)
β’ Include exact file paths in descriptions
Phase 1: Setup (Shared Infrastructure)
Purpose: Add new string resources required by all user stories
β’ [x] T001 Add T383838trace_route string resource ("Trace Route") in T383838core/resources/src/commonMain/composeResources/values/strings.xml
Phase 2: Foundational (Blocking Prerequisites)
Purpose: Refactor NodeContextMenu composable signature and reorder existing items β MUST complete before user story work
β οΈ CRITICAL: No user story work can begin until this phase is complete
β’ [x] T002 Add T383838onMessage and T383838onTraceRoute callback parameters to T383838NodeContextMenu composable in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
β’ [x] T003 Reorder existing menu items (Favorite, Mute, Ignore, Remove) to canonical positions and split into two T383838DropdownMenuGroup sections (items 1-4 and items 5-6) in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
β’ [x] T004 Update T383838NodeListScreen to pass stub/empty lambdas for new T383838onMessage and T383838onTraceRoute parameters to satisfy compiler in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt
Checkpoint: Foundation ready β menu compiles with new signature; user story implementation can now begin in parallel
Phase 3: User Story 1 β Canonical Menu Order (Priority: P1) π― MVP
Goal: Display all 6 context menu items in the cross-platform canonical order: Favorite β Mute notifications β Message β Trace Route β Ignore β Remove
Independent Test: Long-press any node in the node list and verify the menu displays exactly 6 items in the specified order with correct conditional visibility/enabled states.
Implementation for User Story 1
β’ [x] T005 [US1] Add T383838MessageMenuItem composable (position 3) with T383838MeshtasticIcons.Message icon, T383838Res.string.message label, T383838enabled = !node.isIgnored, invoking T383838onMessage callback in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
β’ [x] T006 [US1] Add T383838TraceRouteMenuItem composable (position 4) with T383838MeshtasticIcons.Route icon, T383838Res.string.trace_route label, T383838enabled = !node.isIgnored, invoking T383838onTraceRoute callback in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
β’ [x] T007 [US1] Update T383838MuteMenuItem to use T383838Res.string.mute_notifications instead of T383838Res.string.mute_always for the unmuted state label in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/component/NodeContextMenu.kt
Checkpoint: At this point, User Story 1 should be fully functional β menu displays all 6 items in canonical order with correct enabled/disabled/hidden states
Phase 4: User Story 2 β Message Action (Priority: P2)
Goal: "Message" menu item navigates the user to the direct message conversation with the selected node
Independent Test: Long-press a node, tap "Message", and verify navigation to the messaging screen for that node.
Implementation for User Story 2
β’ [x] T008 [US2] Add T383838getDirectMessageRoute(node: Node) method to T383838NodeListViewModel that computes the conversation contact key (reuse logic from T383838NodeDetailViewModel) in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt
β’ [x] T009 [US2] Wire T383838onMessage callback in T383838NodeListScreen to call T383838viewModel.getDirectMessageRoute(node) and navigate to the messages screen in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt
Checkpoint: At this point, User Stories 1 AND 2 should both work independently β menu is ordered correctly and Message navigates to DM
Phase 5: User Story 3 β Trace Route Action (Priority: P2)
Goal: "Trace Route" menu item initiates a trace route request to the selected node
Independent Test: Long-press a node, tap "Trace Route", and verify the trace route operation is initiated (network request sent).
Implementation for User Story 3
β’ [x] T010 [US3] Inject T383838NodeRequestActions into T383838NodeListViewModel via Koin and add T383838traceRoute(node: Node) method that delegates to T383838requestTraceroute(scope, node.num, node.longName) in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListViewModel.kt
β’ [x] T011 [US3] Wire T383838onTraceRoute callback in T383838NodeListScreen to call T383838viewModel.traceRoute(node) in T383838feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt
Checkpoint: At this point, User Stories 1, 2, AND 3 should all work independently
Phase 6: User Story 4 β Mute Notifications Rename (Priority: P3)
Goal: Mute action displays "Mute notifications" instead of "Mute Always"
Independent Test: Long-press a node that supports muting and verify the label reads "Mute notifications" (not "Mute Always").
Implementation for User Story 4
β’ [x] T012 [US4] Verify and confirm T383838MuteMenuItem references T383838Res.string.mute_notifications (completed in T007) β no additional changes needed if T007 is complete. Validate that no other references to T383838mute_always string exist in T383838feature/node/ module by searching codebase.
Checkpoint: All user stories should now be independently functional
Phase 7: Polish & Cross-Cutting Concerns
Purpose: Verification and compliance tasks required by the project constitution
β’ [x] T013 [P] Review T383838NodeContextMenu.kt against Meshtastic design standards β verify M3 T383838DropdownMenuItem pattern with T383838leadingIcon, TalkBack accessibility (decorative icons with T383838contentDescription = null), and 48dp touch targets
β’ [x] T014 [P] Confirm no logs, telemetry, or config changes expose PII, location data, secrets, or modify T383838core/proto
β’ [x] T015 [P] Run constitution-required verification: T383838./gradlew spotlessApply spotlessCheck detekt :feature:node:allTests :core:resources:allTests β β οΈ blocked by pre-existing T383838core:proto:generateCommonMainProtos failure (unrelated to this feature)
β’ [x] T016 Run T383838./gradlew assembleDebug to verify full project compilation with all changes β β οΈ blocked by pre-existing proto generation failure (unrelated to this feature)
Dependencies & Execution Order
Phase Dependencies
β’ Setup (Phase 1): No dependencies β can start immediately
β’ Foundational (Phase 2): Depends on Phase 1 (string resource must exist) β BLOCKS all user stories
β’ User Stories (Phases 3β6): All depend on Foundational phase completion
β’ US1 (Phase 3): Can start after Phase 2 β no dependencies on other stories
β’ US2 (Phase 4): Can start after Phase 2 β independent of US1 (but T009 edits same file as T004)
β’ US3 (Phase 5): Can start after Phase 2 β independent of US1/US2 (but T011 edits same file as T009)
β’ US4 (Phase 6): Depends on US1 (T007 performs the rename) β validation only
β’ Polish (Phase 7): Depends on all user stories being complete
User Story Dependencies
β’ US1 (P1): Depends only on Phase 2. Edits T383838NodeContextMenu.kt.
β’ US2 (P2): Depends only on Phase 2. Edits T383838NodeListViewModel.kt + T383838NodeListScreen.kt.
β’ US3 (P2): Depends only on Phase 2. Edits T383838NodeListViewModel.kt + T383838NodeListScreen.kt.
β’ US4 (P3): Depends on US1 (T007 already performs the rename).
Within Each User Story
β’ Core composable/menu changes before wiring callbacks
β’ ViewModel methods before Screen wiring
β’ Story complete before moving to next priority
Parallel Opportunities
β’ T005, T006, T007 (US1) all edit the same file β execute sequentially
β’ T008 (US2, ViewModel) and T005/T006/T007 (US1, Menu) can run in parallel (different files)
β’ T010 (US3, ViewModel) can run in parallel with T005/T006/T007 (different files)
β’ T013, T014 (Polish) can run in parallel with each other
Parallel Example: User Stories 1 + 2 + 3
T282828
T8b949e# After Phase 2 (Foundational) completes:
T8b949e# Parallel track A β User Story 1 (NodeContextMenu.kt):
Task T005: Ta5d6ff"Add MessageMenuItem composable"
Task T006: Ta5d6ff"Add TraceRouteMenuItem composable"
Task T007: Ta5d6ff"Update MuteMenuItem label"
T8b949e# Parallel track B β User Stories 2+3 (NodeListViewModel.kt):
Task T008: Ta5d6ff"Add getDirectMessageRoute method"
Task T010: Ta5d6ff"Add traceRoute method"
T8b949e# Then sequential wiring (NodeListScreen.kt):
Task T009: Ta5d6ff"Wire onMessage callback"
Task T011: Ta5d6ff"Wire onTraceRoute callback"
Implementation Strategy
MVP First (User Story 1 Only)
1. Complete Phase 1: Setup (add string resource)
2. Complete Phase 2: Foundational (refactor menu signature + reorder)
3. Complete Phase 3: User Story 1 (add new menu items in canonical order)
4. STOP and VALIDATE: Build and verify menu displays correctly
5. This alone satisfies the primary requirement (FR-001, canonical order)
Incremental Delivery
1. Setup + Foundational β Menu compiles with new signature
2. Add US1 β Menu displays 6 items in canonical order β Build passes (MVP!)
3. Add US2 β Message action navigates to DM β Build passes
4. Add US3 β Trace Route action sends request β Build passes
5. Add US4 β Verify label rename (already done in US1) β Build passes
6. Polish β Run linting, formatting, tests β PR ready
Recommended Execution Order (Single Developer)
1. T001 β T002 β T003 β T004 (Setup + Foundation)
2. T005 β T006 β T007 (US1 β same file, sequential)
3. T008 β T009 (US2 β ViewModel then Screen)
4. T010 β T011 (US3 β ViewModel then Screen)
5. T012 (US4 β validation)
6. T013 β T014 β T015 β T016 (Polish)
Notes
β’ All changes scoped to T383838commonMain source sets per Constitution Β§I
β’ No platform-specific (T383838androidMain/T383838jvmMain) changes required
β’ Existing local node suppression (FR-009) is already implemented β no task needed
β’ String T383838mute_notifications already exists in strings.xml β only T383838trace_route is new
β’ Icons T383838MeshtasticIcons.Message and T383838MeshtasticIcons.Route already exist in T383838core/ui/icon/
Served by rngit 1.5.2 - Generated in 0.12s